package generic;

/**
 * Created with IntelliJ IDEA
 * Description:泛型学习
 * User:22954
 * Date:2024-02-28
 * Time:17:28
 */
@SuppressWarnings("all")
public class Generic {
    /*
    <T>泛型
    1.泛型的声明: interface接口<T>{} / class类<K,V>{}
          T,K,V任意字母都可,代表引用类型而非值,一般用大写T(type)
    2.泛型的意义:可以自动进行类型转换 可以自动进行类型检查
    3.泛型的声明只能是引用类型,不能是基本数据类型
    4.声明泛型类型后,可以传入该类型或子类类型
    5.未声明泛型类型时,编译时被自动擦除为Object
    ================================================
    擦除机制:在编译时,JVM会自动擦除<T>,类和接口中使用的T都会被擦除为Object,使得运行时不存在泛型
            JVM会对引用对象(ArrayList<Integer> list)先进行类型检查,再进行擦除,最后编译
     */
}

/**
 * A后面接<T>泛型,则称A为自定义泛型类
 * 1.普通成员(属性/方法)可以使用泛型
 * 2.使用泛型的数组不能初始化大小(擦除机制会将<T>和引用的T全部转换为Object,但开辟空间的语句不会被检查和擦除,造成编译错误)
 * 3.静态属性和方法不能使用泛型(静态和类相关联,类在加载时,无创建对象指定泛型,JVM无法完成初始化)
 * @param <T>
 */
@SuppressWarnings("all")
class A<T>{
    T t;
    public T getT(){
        return t;
    }
    //T[] tArray = new T[10];
}
